package com.googlecode.gingerman.robot;

import java.lang.Math;
import java.awt.Polygon;
import java.util.ArrayList;
import java.util.List;

public class Locator implements AILocator {
	private double range, angle;
	private Robot robot;
	private int radius, truth;
	
	public Locator(Robot rob){
		robot=rob;
		range=120*Math.PI/180; //угол обзора
		radius=300;  // радиус видимости
		truth=2;  //точность,оставить 2
	}
	 
	public double getWorldWidth() {	
		return robot.getWorld().getWidth();
	}
 
	public double getWorldHeight() {
		return robot.getWorld().getHeight();
	}
	
	public void setAngle(double angle) {
		this.angle = angle;
	}
	
	public double getAngle() {
		return angle;
	}
	
	public double getRange() {
		return range;
	}
	
	public int getRadius() {
		return radius;
	}

	public List<RobotInfo> scanRobots() {
		Polygon p = new Polygon();
		int rx=(int) robot.getX();
		int ry=(int) robot.getY();
		p.addPoint(rx, ry );
		  
		for (int i=2;i<=truth;i++)
			p.addPoint((int) (Math.cos(robot.getAngle() - range / i)*radius) +rx, (int) (Math.sin(robot.getAngle() - range / i)*radius) +ry );

		p.addPoint((int) (Math.cos(robot.getAngle())*radius) +rx,(int) (Math.sin(robot.getAngle())*radius) +ry);
		  
		for (int i=2;i<=truth;i++)
			p.addPoint((int) (Math.cos(robot.getAngle() + range /i)*radius +rx), (int) (Math.sin(robot.getAngle() + range / i)*radius) +ry);

		int countR = robot.getWorld().getRobots().size();
		List<RobotInfo> temp = new ArrayList<RobotInfo>();
		
		for (int i = 0; i <= countR-1; i++) {
			if (p.contains(robot.getWorld().getRobots().get(i).getX(), robot.getWorld().getRobots().get(i).getY()) && robot.getWorld().getRobots().get(i)!=robot) {
				RobotInfo r = new RobotInfo(robot.getWorld().getRobots().get(i).getX(),robot.getWorld().getRobots().get(i).getY(),robot.getWorld().getRobots().get(i).getAngle(),robot.getWorld().getRobots().get(i).getRadius(),robot.getWorld().getRobots().get(i).getIDCmd());
				temp.add(r);
			}
		}
		
		return temp;
	}

	public List<BulletInfo> scanBullets() {
		Polygon p = new Polygon();
	 	int rx=(int) robot.getX(); //текещая координата локатора
	 	int ry=(int) robot.getY();
	 	p.addPoint(rx, ry);
	 	
	 	for (int i=2;i<=truth;i++)
	 		p.addPoint((int) (Math.cos(robot.getAngle() - range / i)*radius) +rx, (int) (Math.sin(robot.getAngle() - range / i)*radius) +ry );

	 	p.addPoint((int) (Math.cos(robot.getAngle())*radius) +rx, (int) (Math.sin(robot.getAngle())*radius) +ry);
	 	
	 	for (int i=2;i<=truth;i++)
	 		p.addPoint((int) (Math.cos(robot.getAngle() + range /i)*radius +rx),(int) (Math.sin(robot.getAngle() + range / i)*radius) +ry);
		
	    int countB=robot.getWorld().getBullets().size();
	    List <BulletInfo> temp = new ArrayList<BulletInfo>();
		
	    for (int i=0;i<=countB-1;i++){			
			if (p.contains(robot.getWorld().getBullets().get(i).getX(),robot.getWorld().getBullets().get(i).getY())) {
				BulletInfo b= new BulletInfo(robot.getWorld().getBullets().get(i).getX(),robot.getWorld().getBullets().get(i).getY(),robot.getWorld().getBullets().get(i).getAngle(),robot.getWorld().getBullets().get(i).getRadius());
				temp.add(b);
			}
		}
		
	    return temp;
	}
	
	public List<WallInfo> scanWalls() {
		Polygon p = new Polygon();
	 	int rx=(int) robot.getX(); //текещая координата локатора
	 	int ry=(int) robot.getY();
	 	p.addPoint(rx, ry);
	 	
	 	for (int i=2;i<=truth;i++)
	 		p.addPoint((int) (Math.cos(robot.getAngle() - range / i)*radius) +rx, (int) (Math.sin(robot.getAngle() - range / i)*radius) +ry );

	 	p.addPoint((int) (Math.cos(robot.getAngle())*radius) +rx, (int) (Math.sin(robot.getAngle())*radius) +ry);
	 	
	 	for (int i=2;i<=truth;i++)
	 		p.addPoint((int) (Math.cos(robot.getAngle() + range /i)*radius +rx),(int) (Math.sin(robot.getAngle() + range / i)*radius) +ry);
		
	 	int countW=robot.getWorld().getWalls().size();
	 	
	 	List <WallInfo> temp = new ArrayList<WallInfo>();
	 	
	 	for (int i=0;i<=countW-1;i++){			
			if (p.contains(robot.getWorld().getWalls().get(i).getX(),robot.getWorld().getWalls().get(i).getY())) {
				WallInfo b= new WallInfo(robot.getWorld().getWalls().get(i).getX(),robot.getWorld().getWalls().get(i).getY(),robot.getWorld().getWalls().get(i).getWidth(),robot.getWorld().getWalls().get(i).getHeigth(),robot.getWorld().getWalls().get(i).getAngle());
				temp.add(b);
			}
	    
	 	}
	 	return temp;	
	}	

}
